package com.hxzy.util.sms;


import com.hxzy.common.enums.AckCode;
import com.hxzy.common.exception.ServiceException;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20210111.models.SendStatus;
import lombok.extern.log4j.Log4j2;

/**
 * @Author wy
 * @Description 模板方法
 * @Date 2023/7/11 15:45
 * @Version 1.0
 */
@Log4j2
public class SmsTemplate {

    private final String secretId="AKIDrSmZ6M199sOedNa2wyjCOIo3nKcdgowp";
    private final String secretKey="lHVsymIX2HFxNYR6UcT7UbS2PWS8gFhu";

    /**
     * 第1步，创建认证账号
     * 查看地址 https://console.cloud.tencent.com/cam/capi
     */
    private Credential  createCredential(){
        Credential cred = new Credential(secretId, secretKey);
        return cred;
    }

    /**
     * 第2步，创建发送短信的模板
     * @param req
     * @return
     */
    protected SendSmsRequest createSendSmsRequest(SmsRequestReq req){
        SendSmsRequest sendSmsRequest = new SendSmsRequest();

        /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId，示例如1400006666 */
        // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
        String sdkAppId = "1400412221";
        sendSmsRequest.setSmsSdkAppId(sdkAppId);

        /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名 */
        // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
        String signName = "易发公众号";
        sendSmsRequest.setSignName(signName);

        /* 模板 ID: 必须填写已审核通过的模板 ID */
        // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
        String templateId = req.getTemplateId();
        sendSmsRequest.setTemplateId(templateId);

        /* 下发手机号码，采用 E.164 标准，+[国家或地区码][手机号]
         * 示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号 */
        String[] phoneNumberSet =req.getPhone();

        sendSmsRequest.setPhoneNumberSet(phoneNumberSet);

        //有参数，必须有序
        if(req.paramsLen()>0){
            String[] templateParamSet =req.params();
            sendSmsRequest.setTemplateParamSet(templateParamSet);
        }

        return sendSmsRequest;
    }


    /**
     * 发短信
     */
    public boolean sendSms(SmsRequestReq req){
        String status="";
        try {
            //认证
            Credential cred = this.createCredential();
            //创建模板
            SendSmsRequest sendSmsRequest = this.createSendSmsRequest(req);

            //发送短信
            SmsClient client = new SmsClient(cred, "ap-guangzhou");

            /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
             * 返回的 res 是一个 SendSmsResponse 类的实例，与请求对象对应 */
            SendSmsResponse res = client.SendSms(sendSmsRequest);

            // 输出json格式的字符串回包
            SendStatus[] sendStatusSetList = res.getSendStatusSet();
            for (SendStatus send : sendStatusSetList) {
                status = send.getCode();
            }
        }catch(TencentCloudSDKException e){
            log.error(e);
            throw new ServiceException(AckCode.SMS_SEND_ERROR);
        }

        return status.equalsIgnoreCase("OK");
    }


}
